package com.ruoyi.sale.mapper;

import java.util.List;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sale.domain.Plan;
import com.ruoyi.sale.domain.ProductAuth;
import com.ruoyi.sale.domain.ShipmentsProduct;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 销售计划Mapper接口
 * 
 * @author ruoyi
 * @date 2023-10-13
 */
@Mapper
public interface PlanMapper extends BaseMapper<Plan>
{
    /**
     * 查询销售计划
     * 
     * @param id 销售计划主键
     * @return 销售计划
     */
    public Plan selectPlanById(@Param("id") Long id);

    /**
     * 查询销售计划列表
     * 
     * @param plan 销售计划
     * @return 销售计划集合
     */
    public List<Plan> selectPlanList(@Param("Req") Plan plan);


    /**
     * 新增销售计划
     * 
     * @param plan 销售计划
     * @return 结果
     */
    public int insertPlan(Plan plan);

    /**
     * 修改销售计划
     * 
     * @param plan 销售计划
     * @return 结果
     */
    public int updatePlan(Plan plan);


    /**
     * 删除销售计划
     * 
     * @param id 销售计划主键
     * @return 结果
     */
    public int deletePlanById(Long id);

    /**
     * 批量删除销售计划
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deletePlanByIds(Long[] ids);

    /**
     * 批量删除发货产品
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteShipmentsProductByPlanIds(Long[] ids);
    
    /**
     * 批量新增发货产品
     * 
     * @param shipmentsProductList 发货产品列表
     * @return 结果
     */
    public int batchShipmentsProduct(List<ShipmentsProduct> shipmentsProductList);
    

    /**
     * 通过销售计划主键删除发货产品信息
     * 
     * @param id 销售计划ID
     * @return 结果
     */
    public int deleteShipmentsProductByPlanId(Long id);

    /**
     * 通过发货id来查询发货的产品
     * @param ids 发货id
     * @return 结果
     */
    public List<ShipmentsProduct> selectShipmentsProductById(@Param("ids") Long[] ids,@Param("flag") Boolean flag);

    /**
     * 发起审核，修改成审核中
     * @param id
     * @return
     */
    public int updatePlanStatusById(Long id);

    /**
     * 查询要进行审批的人
     * @return
     */
    public List<Plan> selectPostUserDept(@Param("deptIds") Long[] deptIds);

    /**
     * 查询用户审批人物
     * @param userId
     * @return
     */
    public String selectAncestors(@Param("userId") Long userId);

    /**
     * 修改审批状态
     * @return
     */
    public int updateStatus(@Param("planStatus") String planStatus,@Param("id") Long id);

    /**
     * 查询自己已审批的数据
     * @return 结果
     */
    public List<Plan> selectPlanReviewed(Plan plan);

    /**
     * 查询自己已发起的数据
     * @param userId
     * @return
     */
    public List<Plan> selectPlanInitiated(@Param("userId") Long userId);

    /**
     *通过最新的时间来查询计划编号
     * @return
     */
    public String selectPlanNumber();


    /**
     * 通过店铺查询关联了哪些数据
     * @param productAuth
     * @return
     */
    public List<ProductAuth> selectItemPlan(ProductAuth productAuth);

    /**
     * 通过关联商品查询数据
     * @param plan
     * @return
     */
    public List<ProductAuth> selectPairId(Plan plan);

    /**
     * 根据销售计划编号组查询销售计划数据
     * @param ids
     * @return
     */
    List<Plan> selectPlanByIds(@Param("ids") List<Long> ids);

    /**
     *  更新当前审核人用户
     * @param plan
     * @return
     */
    void updatePlanReviewerUserId(Plan plan);
    /**
     * 待我审核的销售计划
     * @param plan
     * @return 结果
     */
    List<Plan> getPlanWaitProcessList(Plan plan);
    /**
     * 更新销售计划状态
     * @param plan
     * @return 结果
     */
    int updatePlanReviewStatus(Plan plan);

    /**
     * 提前结束销售计划（修改是否已全部下单状态）
     * @return
     */
	int endPlanById(@Param("planId") Long planId);

    /**
     * 根据采购计划id
     * @param planId
     * @param productId
     * @return
     */
    int updateSelectStatus(@Param("planId") Long planId,@Param("productId") Integer productId);

    /**
     * 根据sku查询对应的销售计划列表
     * @param searchSku
     * @return
     */
    List<Long> selectPlanIdsBySku(@Param("sku") String searchSku);
}
